#include "clientserveur.h"

int envoyer_Rapport(int socket, char *utilisateur)
{
  int fd;
  size_t tailleFichier = 0;
  int ret = 0;
  char buff[1024];
  fd = OuvreRapport(utilisateur);

  if(fd == -1)
    {
      ret = send(socket, &tailleFichier, sizeof(size_t), 0);
      if(ret == -1)
	{
	  perror("Erreur send");
	  exit(1);
	}
      return -1;
    }
	  
  /* Lecture du fichier une première fois pour connaitre le nombre de caractére */
  while((ret = read(fd, buff, 1023)) > 0)
    tailleFichier += ret;
  ret = send(socket, &tailleFichier, sizeof(size_t), 0);
  
  if(lseek(fd, 0, SEEK_SET) < 0)
    {
      perror("Erreur lseek");
      exit(1);
    }
  while((ret = read(fd, buff, 1023)) > 0)
    {
      ret = send(socket, &(buff), ret * sizeof(char), 0);
      if(ret == -1)
	{
	  perror("Erreur send");
	  exit(1);
	}
    }
  if(close(fd) == -1)
    {
      perror("Erreur close");
      exit(1);
    }
  return 0;
}

int recevoir_Rapport(int socket, char *utilisateur)
{
  size_t tailleFichier = 0;
  int tailleReception = 0;
  int ret = 0;
  char buff[1024];
  int fd;
  char *locationRapport = NULL;
  locationRapport = (char *) malloc ((strlen(utilisateur) + strlen("recup.pdf") + 2) * sizeof(char));
  if(locationRapport == NULL)
    {
      fprintf(stderr, "Erreur malloc\n");
      exit(1);
    }
  if(sprintf(locationRapport, "%s/recup.pdf", utilisateur) < 0)
    {
      perror("Erreur sprintf");
      exit(1);
    }
  ret = recv(socket, &tailleFichier, sizeof(size_t), 0);
  if(ret == -1)
    {
      perror("Erreur recv");
      exit(1);
    }
  fd = open(locationRapport, O_WRONLY|O_CREAT|O_TRUNC,
	     S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
  free(locationRapport);
  while(tailleReception < tailleFichier)
    {
      ret = recv(socket, &buff, ((tailleFichier - tailleReception) < 1023 ? (tailleFichier - tailleReception) : 1023) * sizeof(char), 0);
      if(ret == -1)
	{
	  perror("Erreur recv");
	  exit(1);
	}
      buff[ret + 1] = '\0';
      tailleReception += ret;
      write(fd, buff, ret*sizeof(char));
    }
  if(close(fd) == -1)
    {
      perror("Erreur close");
      exit(1);
    }
  
  return 0;
}
